package com.cdeledu.thread4.c15;

/**TaskLifecycle接口定义了在任务执行的生命周期中会被触发的接口，其中EmptyLifycycle是一个空的实现，主要是为了让使用者保持对Thread类的使用习惯
 * @author HP
 *
 * @param <T>
 */
public interface TaskLifecycle<T> {
	
	/**当任务开始执行时会被回调的方法
	 * @param thread
	 */
	void onStart(Thread thread);

	/**任务运行时被回调的方法，由于我们针对的是任务的生命周期，不同于线程生命周期中的RUNNING状态，如果当前线程进入了休眠或者阻塞，那么任务都是running状态
	 * @param thread
	 */
	void onRunning(Thread thread);

	/**任务正确执行结束后会被回调，其中result是任务执行后的结果，可允许为null
	 * @param thread
	 * @param result
	 */
	void onFinish(Thread thread, T result);

	/**任务在运行过程中出现任何异常抛出时，onError方法都将被回调，并将异常信息一并传入
	 * @param thread
	 * @param e
	 */
	void onError(Thread thread, Exception e);

	class EmptyLifecycle<T> implements TaskLifecycle<T> {
		@Override
		public void onStart(Thread thread) {
			//do nothing
		}

		@Override
		public void onRunning(Thread thread) {
			//do nothing
		}

		@Override
		public void onFinish(Thread thread, T result) {
			//do nothing
		}

		@Override
		public void onError(Thread thread, Exception e) {
			//do nothing
		}
	}

}
